﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using QLabValues;
using AtomicTypes;
	
		
	



namespace NumericalCalculations
{
     public partial class Functions
    {


        public List<IQLabValue> vertcat(List<IQLabValue> o)
        {
            int i = 0;

            if (o.Count == 0)
            {
                //ovde treba da vrati prazan skup tj []
                throw (new NumericalCalculationsException("??? Too little arguments for function vertcat\n"));
            }
            else if (o.Count == 1) return o;

            List<IQLabValue> niz = new List<IQLabValue>(o);

            for (; i < o.Count - 1; i++)
            {






                //Ako su je prvi QCharNdimArray a drugi moze da se konvertuje - tu je ukljuceno i da je string - treba jos dorada
#region Prvi QCharNDimArray a drugi moze da se konvertuje ili obrnuto
                 if (( (niz.ElementAt(i).GetEnumType() == IQLabValueType.QCharNDimArray) && Helper.canConvertToEnum(niz.ElementAt(i+1),IQLabValueType.QCharNDimArray) ) || ((niz.ElementAt(i+1).GetEnumType() == IQLabValueType.QCharNDimArray) && Helper.canConvertToEnum(niz.ElementAt(i),IQLabValueType.QCharNDimArray)))
                {



                    //Vadimo dimenzije
                     int[] fd = (int[])((QCharNDimArray)niz.ElementAt(i)).DimensionSize.Clone();
                     int[] sd = (int[])((QCharNDimArray)niz.ElementAt(i+1)).DimensionSize.Clone();

                    // Pitamo da li ima isti broj dimenzija
                if (fd.Count() != sd.Count())
                {
                throw (new NumericalCalculationsException("??? Error using ==> vertcat"+"\n"+"CAT arguments dimensions are not consistent."));
                }
                    //Zatim da li se dimenzije poklapaju
                for (int j = 1; j < fd.Count(); j++)
                if (fd[j] != sd[j])
                    throw (new NumericalCalculationsException("??? Error using ==> vertcat" + "\n" + "CAT arguments dimensions are not consistent."));
                    //Dodajem nultu dimenziju na drugu posto mi prva treba netaknuta
                sd[0]+= fd[0];
                    // pravim pomocnu ndimenzioni niz karaktera dimenzija sd
                    QCharNDimArray pom=new QCharNDimArray(sd);

                    Counter c = new Counter(pom.DimensionSize);

                        for (c.reset(); !c.isAtEnd(); c.plusPlus())
                        {
                            int[] index = c.getCurrent();
                            if(fd[0]>=index[0])  pom[index]=((QCharNDimArray)niz.ElementAt(i))[index];
                            else
                            {
                                int[] pom1=(int [])index.Clone();
                                pom1[0] = index[0]-fd[0];
                                pom[index]=((QCharNDimArray)niz.ElementAt(i+1))[pom1];
                            }

                        }
                        niz[i + 1] = pom;


                }
#endregion
                //ako je jedan od dva QCharNDimArray a drugi ne moze da se konvertuje
#region Ako je prvi QCharNDimArray a drugi ne moze da se konvertuje
                else if ( (niz.ElementAt(i).GetEnumType() == IQLabValueType.QCharNDimArray) && !(Helper.canConvertToEnum(niz.ElementAt(i+1),IQLabValueType.QCharNDimArray)) )
                {
                   //Ovde znamo da treba da izbacimo warning i da uradimo dalje
                    //Kada se napravi globalna promenljiva za warninge ovde treba da se doda deo koda
                    if (!(Helper.canConvertToEnum(niz.ElementAt(i+1),IQLabValueType.QFloat64NDimArray)))
                    {
                        throw (new NumericalCalculationsException("??? Undefined function or method 'vertcat' for input arguments of type " +
                        Helper.PrintEnumName(Helper.TypeOfThatCouldNotConvert(o,IQLabValueType.QFloat64NDimArray))+"."));
                    }

                    int[] fd = (int[])((QCharNDimArray)niz.ElementAt(i)).DimensionSize.Clone();
                    int[] sd = (int[])((QFloat64NDimArray)niz.ElementAt(i+1)).DimensionSize.Clone();

                    if (fd.Count() != sd.Count())
                    {
                        throw (new NumericalCalculationsException("??? Error using ==> vertcat" + "\n" + "CAT arguments dimensions are not consistent."));
                    }
                    //Zatim da li se dimenzije poklapaju
                    for (int j = 1; j < fd.Count(); j++)
                    if (fd[j] != sd[j])
                        throw (new NumericalCalculationsException("??? Error using ==> vertcat" + "\n" + "CAT arguments dimensions are not consistent."));
                    //Dodajem nultu dimenziju na drugu posto mi prva treba netaknuta
                    sd[0]+= fd[0];
                    QCharNDimArray pom = new QCharNDimArray(sd);
                    //Dalje ce da konvertujemo sve u qfloat64ndimarray
                    QFloat64NDimArray el2 = new QFloat64NDimArray(niz.ElementAt(i+1));
                    Counter c = new Counter(pom.DimensionSize);

                        for (c.reset(); !c.isAtEnd(); c.plusPlus())
                        {
                            int[] index = c.getCurrent();
                            if(fd[0]>=index[0])  pom[index]=((QCharNDimArray)niz.ElementAt(i))[index];
                            else
                            {
                                QChar ch=new QChar(' ');
                                int[] pom1=(int [])index.Clone();
                                pom1[0] = index[0]-fd[0];
                                QFloat64 br=new QFloat64(((QFloat64NDimArray)niz.ElementAt(i+1))[pom1]);
                                //Treba proveriti da li je imaginarni deo nula, jer ako nije treba da se baci exeption
                                if (br.Imag != 0)
                                {
                                    throw (new NumericalCalculationsException("??? Error using ==> vertcat"+"\n"+"The following error occurred converting from double to char:"+"\n"+"Error using ==> char"+"\n"+"Complex values cannot be converted to char"));
                                }

                                // oko nule proveri koliko mu je int od -0.1 ako je -1 onda je ok ako je 0 onda treba staviti <=-1
                                //Char u matlabu je od 0 do 255 ukljucujuci i granice tj extended ascii
                                if ((br.Real<0) || (br.Real>=256))
                                {
                                    //Ovde znamo da treba da izbacimo warning i da uradimo dalje
                                    //Kada se napravi globalna promenljiva za warninge ovde treba da se doda deo koda
                                    pom[index]=ch;
                                }
                                else
                                {
                                    //Inace znamo da je karakter
                                    QInt64 br2=new QInt64(br);
                                    QChar br3=new QChar(br2);
                                    pom[index]=br3;
                                }


                            }

                        }
                        niz[i + 1] = pom;

                    //Onda cemo da idemo i pitamo da li pojedinacni moze da se pretvori u char ako moze super ako ne izbacujem razmak
                }
#endregion
                    // Ovde isto kao u prethodnom elsu samo je sledeci
#region Ako je drugi QCharNDimArray a prvi ne moze da se konvertuje
                    else if  ((niz.ElementAt(i+1).GetEnumType() == IQLabValueType.QCharNDimArray) && !(Helper.canConvertToEnum(niz.ElementAt(i),IQLabValueType.QCharNDimArray)))
                    {
                    //Ovde znamo da treba da izbacimo warning i da uradimo dalje
                    //Kada se napravi globalna promenljiva za warninge ovde treba da se doda deo koda
                    if (!(Helper.canConvertToEnum(niz.ElementAt(i),IQLabValueType.QFloat64NDimArray)))
                    {
                        throw (new NumericalCalculationsException("??? Undefined function or method 'vertcat' for input arguments of type " +
                        Helper.PrintEnumName(Helper.TypeOfThatCouldNotConvert(o,IQLabValueType.QFloat64NDimArray))+"."));
                    }

                    int[] fd = (int[])((QFloat64NDimArray)niz.ElementAt(i+1)).DimensionSize.Clone();
                    int[] sd = (int[])((QCharNDimArray)niz.ElementAt(i)).DimensionSize.Clone();

                    if (fd.Count() != sd.Count())
                    {
                        throw (new NumericalCalculationsException("??? Error using ==> vertcat" + "\n" + "CAT arguments dimensions are not consistent."));
                    }
                    //Zatim da li se dimenzije poklapaju
                    for (int j = 1; j < fd.Count(); j++)
                    if (fd[j] != sd[j])
                    throw (new NumericalCalculationsException("??? Error using ==> vertcat"+"\n"+"CAT arguments dimensions are not consistent."));
                    //Dodajem nultu dimenziju na drugu posto mi prva treba netaknuta
                    sd[0]+= fd[0];
                    QCharNDimArray pom = new QCharNDimArray(sd);
                    //Dalje ce da konvertujemo sve u qfloat64ndimarray
                    QFloat64NDimArray el2 = new QFloat64NDimArray(niz.ElementAt(i));
                    Counter c = new Counter(pom.DimensionSize);

                        for (c.reset(); !c.isAtEnd(); c.plusPlus())
                        {
                            int[] index = c.getCurrent();
                            if(fd[0]>=index[0])  pom[index]=((QCharNDimArray)niz.ElementAt(i+1))[index];
                            else
                            {
                                QChar ch=new QChar(' ');
                                int[] pom1=(int [])index.Clone();
                                pom1[0] = index[0]-fd[0];
                                QFloat64 br=new QFloat64(((QFloat64NDimArray)niz.ElementAt(i))[pom1]);
                                //Opet pitamo da li je imaginarni deo razliciti od nule ako ije mora da bacimo exeption
                                if (br.Imag != 0)
                                {
                                    throw (new NumericalCalculationsException("??? Error using ==> vertcat" + "\n" + "The following error occurred converting from double to char:" + "\n" + "Error using ==> char" + "\n" + "Complex values cannot be converted to char"));
                                }
                                // oko nule proveri koliko mu je int od -0.1 ako je -1 onda je ok ako je 0 onda treba staviti <=-1
                                //Char u matlabu je od 0 do 255 ukljucujuci i granice tj extended ascii
                                if ((br.Real<0) || (br.Real>=256))
                                {
                                    //Ovde znamo da treba da izbacimo warning i da uradimo dalje
                                    //Kada se napravi globalna promenljiva za warninge ovde treba da se doda deo koda
                                    pom[index]=ch;
                                }
                                else
                                {
                                    //Inace znamo da je karakter
                                    QInt64 br2=new QInt64(br);
                                    QChar br3=new QChar(br2);
                                    pom[index]=br3;
                                }


                            }

                        }
                        niz[i + 1] = pom;

                    //Onda cemo da idemo i pitamo da li pojedinacni moze da se pretvori u char ako moze super ako ne izbacujem razmak

                    }
#endregion
                    //Ako oba mogu da se konvertuju u QFloat64NDimArray
#region INACE ako oba mogu da se konvertuju u QFloat64NDimArray
                    else if (Helper.canConvertToEnum(niz.ElementAt(i),IQLabValueType.QFloat64NDimArray) && Helper.canConvertToEnum(niz.ElementAt(i+1),IQLabValueType.QFloat64NDimArray))
                    {

                    int[] fd = (int[])((QFloat64NDimArray)niz.ElementAt(i)).DimensionSize.Clone();
                    int[] sd = (int[])((QFloat64NDimArray)niz.ElementAt(i+1)).DimensionSize.Clone();

                    if (fd.Count() != sd.Count())
                    {
                        throw (new NumericalCalculationsException("??? Error using ==> vertcat" + "\n" + "CAT arguments dimensions are not consistent."));
                    }
                    for (int j = 1; j < fd.Count(); j++)
                    if (fd[j] != sd[j])
                        throw (new NumericalCalculationsException("??? Error using ==> vertcat" + "\n" + "CAT arguments dimensions are not consistent."));
                    sd[0]+= fd[0];
                    QFloat64NDimArray pom=new QFloat64NDimArray(sd);
                    Counter c = new Counter(pom.DimensionSize);



                        for (c.reset(); !c.isAtEnd(); c.plusPlus())
                        {
                            int[] index = c.getCurrent();
                            if(fd[0]>=index[0])  pom[index]=((QFloat64NDimArray)niz.ElementAt(i))[index]; // Ovde je pisalo fd[0]<=index[0] sto mislim da nije tacno
                            else
                            {
                                int[] pom1=(int [])index.Clone();
                                pom1[0] = index[0]-fd[0];
                                pom[index]=((QFloat64NDimArray)niz.ElementAt(i+1))[pom1];
                            }

                        }
                        niz[i + 1] = pom;


                }
#endregion
                //Ako ne mozemo da konvertujemo u QFloat64NDimArray
                else
                {
                    throw (new NumericalCalculationsException("??? Undefined function or method 'vertcat' for input arguments of type " +
                    Helper.PrintEnumName(Helper.TypeOfThatCouldNotConvert(o,IQLabValueType.QFloat64NDimArray))+"."));
                }
            }

            List<IQLabValue> rez = new List<IQLabValue>();
            rez.Add(niz[i]);
            return rez;



        }

        public List<IQLabValue> horzcat(List<IQLabValue> o)
        {
            int i = 0;

            if (o.Count == 0)
            {
                //ovde treba da vrati prazan skup tj []
                throw (new NumericalCalculationsException("??? Too little arguments for function horzcat\n"));
            }
            else if (o.Count == 1) return o;

            List<IQLabValue> niz = new List<IQLabValue>(o);

            for (; i < o.Count - 1; i++)
            {






                //Ako su je prvi QCharNdimArray a drugi moze da se konvertuje - tu je ukljuceno i da je string - treba jos dorada
                #region Prvi QCharNDimArray a drugi moze da se konvertuje ili obrnuto
                if (((niz.ElementAt(i).GetEnumType() == IQLabValueType.QCharNDimArray) && Helper.canConvertToEnum(niz.ElementAt(i + 1), IQLabValueType.QCharNDimArray)) || ((niz.ElementAt(i+1).GetEnumType() == IQLabValueType.QCharNDimArray) && Helper.canConvertToEnum(niz.ElementAt(i),IQLabValueType.QCharNDimArray)))
                {



                    //Vadimo dimenzije
                    int[] fd = (int[])((QCharNDimArray)niz.ElementAt(i)).DimensionSize.Clone();
                    int[] sd = (int[])((QCharNDimArray)niz.ElementAt(i + 1)).DimensionSize.Clone();

                    // Pitamo da li ima isti broj dimenzija
                    if (fd.Count() != sd.Count())
                    {
                        throw (new NumericalCalculationsException("??? Error using ==> horzcat" + "\n" + "CAT arguments dimensions are not consistent."));
                    }
                    //Zatim da li se dimenzije poklapaju
                    if (sd[0] != fd[0]) throw (new NumericalCalculationsException("??? Error using ==> horzcat" + "\n" + "CAT arguments dimensions are not consistent."));
                        for (int j = 2; j < fd.Count(); j++)
                        if (fd[j] != sd[j])
                            throw (new NumericalCalculationsException("??? Error using ==> horzcat" + "\n" + "CAT arguments dimensions are not consistent."));
                    //Dodajem nultu dimenziju na drugu posto mi prva treba netaknuta
                    sd[1] += fd[1];
                    // pravim pomocnu ndimenzioni niz karaktera dimenzija sd
                    QCharNDimArray pom = new QCharNDimArray(sd);

                    Counter c = new Counter(pom.DimensionSize);

                    for (c.reset(); !c.isAtEnd(); c.plusPlus())
                    {
                        int[] index = c.getCurrent();
                        if (fd[1] >= index[1]) pom[index] = ((QCharNDimArray)niz.ElementAt(i))[index];
                        else
                        {
                            int[] pom1 = (int[])index.Clone();
                            pom1[1] = index[1] - fd[1];
                            pom[index] = ((QCharNDimArray)niz.ElementAt(i + 1))[pom1];
                        }

                    }
                    niz[i + 1] = pom;


                }
                #endregion
                //ako je jedan od dva QCharNDimArray a drugi ne moze da se konvertuje
                #region Ako je prvi QCharNDimArray a drugi ne moze da se konvertuje
                else if ((niz.ElementAt(i).GetEnumType() == IQLabValueType.QCharNDimArray) && !(Helper.canConvertToEnum(niz.ElementAt(i + 1), IQLabValueType.QCharNDimArray)))
                {
                    //Ovde znamo da treba da izbacimo warning i da uradimo dalje
                    //Kada se napravi globalna promenljiva za warninge ovde treba da se doda deo koda
                    if (!(Helper.canConvertToEnum(niz.ElementAt(i + 1), IQLabValueType.QFloat64NDimArray)))
                    {
                        throw (new NumericalCalculationsException("??? Undefined function or method 'horzcat' for input arguments of type " +
                        Helper.PrintEnumName(Helper.TypeOfThatCouldNotConvert(o, IQLabValueType.QFloat64NDimArray)) + "."));
                    }

                    int[] fd = (int[])((QCharNDimArray)niz.ElementAt(i)).DimensionSize.Clone();
                    int[] sd = (int[])((QFloat64NDimArray)niz.ElementAt(i + 1)).DimensionSize.Clone();

                    if (fd.Count() != sd.Count())
                    {
                        throw (new NumericalCalculationsException("??? Error using ==> horzcat" + "\n" + "CAT arguments dimensions are not consistent."));
                    }
                    //Zatim da li se dimenzije poklapaju
                    if (sd[0] != fd[0]) throw (new NumericalCalculationsException("??? Error using ==> horzcat" + "\n" + "CAT arguments dimensions are not consistent."));

                    for (int j = 2; j < fd.Count(); j++)
                        if (fd[j] != sd[j])
                            throw (new NumericalCalculationsException("??? Error using ==> horzcatcat" + "\n" + "CAT arguments dimensions are not consistent."));
                    //Dodajem nultu dimenziju na drugu posto mi prva treba netaknuta
                    sd[1] += fd[1];
                    QCharNDimArray pom = new QCharNDimArray(sd);
                    //Dalje ce da konvertujemo sve u qfloat64ndimarray
                    QFloat64NDimArray el2 = new QFloat64NDimArray(niz.ElementAt(i + 1));
                    Counter c = new Counter(pom.DimensionSize);

                    for (c.reset(); !c.isAtEnd(); c.plusPlus())
                    {
                        int[] index = c.getCurrent();
                        if (fd[1] >= index[1]) pom[index] = ((QCharNDimArray)niz.ElementAt(i))[index];
                        else
                        {
                            QChar ch = new QChar(' ');
                            int[] pom1 = (int[])index.Clone();
                            pom1[1] = index[1] - fd[1];
                            QFloat64 br = new QFloat64(((QFloat64NDimArray)niz.ElementAt(i + 1))[pom1]);
                            //Treba proveriti da li je imaginarni deo nula, jer ako nije treba da se baci exeption
                            if (br.Imag != 0)
                            {
                                throw (new NumericalCalculationsException("??? Error using ==> horzcat" + "\n" + "The following error occurred converting from double to char:" + "\n" + "Error using ==> char" + "\n" + "Complex values cannot be converted to char"));
                            }

                            // oko nule proveri koliko mu je int od -0.1 ako je -1 onda je ok ako je 0 onda treba staviti <=-1
                            //Char u matlabu je od 0 do 255 ukljucujuci i granice tj extended ascii
                            if ((br.Real < 0) || (br.Real >= 256))
                            {
                                //Ovde znamo da treba da izbacimo warning i da uradimo dalje
                                //Kada se napravi globalna promenljiva za warninge ovde treba da se doda deo koda
                                pom[index] = ch;
                            }
                            else
                            {
                                //Inace znamo da je karakter
                                QInt64 br2 = new QInt64(br);
                                QChar br3 = new QChar(br2);
                                pom[index] = br3;
                            }


                        }

                    }
                    niz[i + 1] = pom;

                    //Onda cemo da idemo i pitamo da li pojedinacni moze da se pretvori u char ako moze super ako ne izbacujem razmak
                }
                #endregion
                // Ovde isto kao u prethodnom elsu samo je sledeci
                #region Ako je drugi QCharNDimArray a prvi ne moze da se konvertuje
                else if ((niz.ElementAt(i + 1).GetEnumType() == IQLabValueType.QCharNDimArray) && !(Helper.canConvertToEnum(niz.ElementAt(i), IQLabValueType.QCharNDimArray)))
                {
                    //Ovde znamo da treba da izbacimo warning i da uradimo dalje
                    //Kada se napravi globalna promenljiva za warninge ovde treba da se doda deo koda
                    if (!(Helper.canConvertToEnum(niz.ElementAt(i), IQLabValueType.QFloat64NDimArray)))
                    {
                        throw (new NumericalCalculationsException("??? Undefined function or method 'horzcatcat' for input arguments of type " +
                        Helper.PrintEnumName(Helper.TypeOfThatCouldNotConvert(o, IQLabValueType.QFloat64NDimArray)) + "."));
                    }

                    int[] fd = (int[])((QFloat64NDimArray)niz.ElementAt(i + 1)).DimensionSize.Clone();
                    int[] sd = (int[])((QCharNDimArray)niz.ElementAt(i)).DimensionSize.Clone();

                    if (fd.Count() != sd.Count())
                    {
                        throw (new NumericalCalculationsException("??? Error using ==> horzcatcat" + "\n" + "CAT arguments dimensions are not consistent."));
                    }
                    //Zatim da li se dimenzije poklapaju
                    if (sd[0] != fd[0]) throw (new NumericalCalculationsException("??? Error using ==> horzcat" + "\n" + "CAT arguments dimensions are not consistent."));

                    for (int j = 2; j < fd.Count(); j++)
                        if (fd[j] != sd[j])
                            throw (new NumericalCalculationsException("??? Error using ==> horzcatcat" + "\n" + "CAT arguments dimensions are not consistent."));
                    //Dodajem nultu dimenziju na drugu posto mi prva treba netaknuta
                    sd[1] += fd[1];
                    QCharNDimArray pom = new QCharNDimArray(sd);
                    //Dalje ce da konvertujemo sve u qfloat64ndimarray
                    QFloat64NDimArray el2 = new QFloat64NDimArray(niz.ElementAt(i));
                    Counter c = new Counter(pom.DimensionSize);

                    for (c.reset(); !c.isAtEnd(); c.plusPlus())
                    {
                        int[] index = c.getCurrent();
                        if (fd[1] >= index[1]) pom[index] = ((QCharNDimArray)niz.ElementAt(i + 1))[index];
                        else
                        {
                            QChar ch = new QChar(' ');
                            int[] pom1 = (int[])index.Clone();
                            pom1[1] = index[1] - fd[1];
                            QFloat64 br = new QFloat64(((QFloat64NDimArray)niz.ElementAt(i))[pom1]);
                            //Opet pitamo da li je imaginarni deo razliciti od nule ako ije mora da bacimo exeption
                            if (br.Imag != 0)
                            {
                                throw (new NumericalCalculationsException("??? Error using ==> horzcat" + "\n" + "The following error occurred converting from double to char:" + "\n" + "Error using ==> char" + "\n" + "Complex values cannot be converted to char"));
                            }
                            // oko nule proveri koliko mu je int od -0.1 ako je -1 onda je ok ako je 0 onda treba staviti <=-1
                            //Char u matlabu je od 0 do 255 ukljucujuci i granice tj extended ascii
                            if ((br.Real < 0) || (br.Real >= 256))
                            {
                                //Ovde znamo da treba da izbacimo warning i da uradimo dalje
                                //Kada se napravi globalna promenljiva za warninge ovde treba da se doda deo koda
                                pom[index] = ch;
                            }
                            else
                            {
                                //Inace znamo da je karakter
                                QInt64 br2 = new QInt64(br);
                                QChar br3 = new QChar(br2);
                                pom[index] = br3;
                            }


                        }

                    }
                    niz[i + 1] = pom;

                    //Onda cemo da idemo i pitamo da li pojedinacni moze da se pretvori u char ako moze super ako ne izbacujem razmak

                }
                #endregion
                //Ako oba mogu da se konvertuju u QFloat64NDimArray
                #region INACE ako oba mogu da se konvertuju u QFloat64NDimArray
                else if (Helper.canConvertToEnum(niz.ElementAt(i), IQLabValueType.QFloat64NDimArray) && Helper.canConvertToEnum(niz.ElementAt(i + 1), IQLabValueType.QFloat64NDimArray))
                {

                    int[] fd = (int[])((QFloat64NDimArray)niz.ElementAt(i)).DimensionSize.Clone();
                    int[] sd = (int[])((QFloat64NDimArray)niz.ElementAt(i + 1)).DimensionSize.Clone();

                    if (fd.Count() != sd.Count())
                    {
                        throw (new NumericalCalculationsException("??? Error using ==> horzcat" + "\n" + "CAT arguments dimensions are not consistent."));
                    }
                    //proveravamo dimenzije
                    if (sd[0] != fd[0]) throw (new NumericalCalculationsException("??? Error using ==> horzcat" + "\n" + "CAT arguments dimensions are not consistent."));

                    for (int j = 2; j < fd.Count(); j++)
                        if (fd[j] != sd[j])
                            throw (new NumericalCalculationsException("??? Error using ==> horzcat" + "\n" + "CAT arguments dimensions are not consistent."));
                    sd[1] += fd[1];
                    QFloat64NDimArray pom = new QFloat64NDimArray(sd);
                    Counter c = new Counter(pom.DimensionSize);



                    for (c.reset(); !c.isAtEnd(); c.plusPlus())
                    {
                        int[] index = c.getCurrent();
                        if (fd[1] >= index[1]) pom[index] = ((QFloat64NDimArray)niz.ElementAt(i))[index]; // Ovde je pisalo fd[0]<=index[0] sto mislim da nije tacno
                        else
                        {
                            int[] pom1 = (int[])index.Clone();
                            pom1[1] = index[1] - fd[1];
                            pom[index] = ((QFloat64NDimArray)niz.ElementAt(i + 1))[pom1];
                        }

                    }
                    niz[i + 1] = pom;


                }
                #endregion
                //Ako ne mozemo da konvertujemo u QFloat64NDimArray
                else
                {
                    throw (new NumericalCalculationsException("??? Undefined function or method 'horzcatcat' for input arguments of type " +
                    Helper.PrintEnumName(Helper.TypeOfThatCouldNotConvert(o, IQLabValueType.QFloat64NDimArray)) + "."));
                }
            }

            List<IQLabValue> rez = new List<IQLabValue>();
            rez.Add(niz[i]);
            return rez;

        }

        public List<IQLabValue> cat(List<IQLabValue> o)
        {
            return null;
        }
    }
}
